#ifndef RAPPORTEURDEFICHIER_HPP
#define RAPPORTEURDEFICHIER_HPP

#include <QtCore/QObject>

#include <QtNetwork/QNetworkReply>

#include <string>

class QNetworkAccessManager;
class QIODevice;

class QString;

/**
 * Classe responsable de la récupération des fichier XML. On lui donne
 * une url, et le fichier est téléchargé. Une fois le téléchargement
 * effectué, on émet un signal qui donne l'état du téléchargement.
 *
 * @author Johan "Solo" Luisier
 * @date 2011/10/19
 *
 * s'inspirer de http://developer.qt.nokia.com/forums/viewthread/7091/ et
 * http://developer.qt.nokia.com/forums/viewthread/7425
 */
class RapporteurDeFichier : public QObject
{
  Q_OBJECT
public:
    /** Constructeur standard.
      * Initialise les membres.
      *
      * @param[in] parent pointeur sur le QObject parent.
      */
  RapporteurDeFichier( QObject * parent = 0 );
  /** Destructeur.
    * Le destructeur n'a rien de spécial à faire.
    */
  virtual ~RapporteurDeFichier();
  /** Permet de déterminer l'url depuis laquelle le fichier sera téléchargé.
    * La méthode initialise le membre @c ReponseReseau et connecte le signal
    * QNetworkRequest::finished() au slot RapporteurDeFichier::telecharge(). De
    * cette manière, une fois le fichier entièrement téléchargé, on envoie le
    * signal indiquant que le contenu a été récupéré.
    *
    * @param[in] url url du fichier XML à télécharger.
    */
  void setUrl( const QString& url );
  /** Permet d'accéder à @c ReponseReseau.
    *
    * @return le pointeur @c ReponseReseau.
    */
  QIODevice * reponseReseau() const;
public slots:
  /** Slot appelé lors du téléchargement complet du fichier.
    * Cette méthode ne fait que lire le status du téléchargement et émet le
    * signal fichierRécupere.
    *
    * @emits fichierRecupere( QNetworkReply::NetworkError ).
    */
  void telecharge();
protected:
  /** Membre permettant d'effectuer une requête réseau. Effectue le
    * téléchargement du fichier XML.
    */
  QNetworkAccessManager * GerantAcces;
  /** Membre qui stocke la réponse réseau. Dans le cas idéal, son statut est
    * OK et le fichier XML est lisible comme si ouvert depuis le disque. En
    * cas d'erreur, le statut est accessible.
    */
  QNetworkReply * ReponseReseau;
signals:
  /** Signal émis une fois le téléchargement terminé.
    *
    * @param[out] statut état de la requête réseau. Un 0 signifie que le
    * téléchargement s'est effectué correctement.
    */
  void fichierRecupere( QNetworkReply::NetworkError statut );
};

#endif // RAPPORTEURDEFICHIER_HPP
